package org.ruanjj.intern;

public class Demo1 {
    public static void main(String[] args) {
        //字面量， 在字符串常量中创建"ab"
        String s0 = "ab";

        //在堆中创建了String 对象，在字符串常量池中创建了对象"ab"
        String s1 = new String("ab");
        System.out.println(s0 == s1); //false

        String s2 = new String("ab");
        System.out.println(s1 == s2); //false

        String s3 = new String("a");
        String s5 = s3.intern();
        String s4 = "a";
        System.out.println(s3 == s4);//false
        System.out.println(s5 == s4);//true

        //1.创建了StringBuilder 对象
        //2.创建了String对象
        //3.字符串常量池中创建了"b"(字符串常量池中不存在的情况下)
        //4.创建了String对象
        //5.字符串常量池中创建了"c"（字符串常量池中不存在的情况下）
        //6.StringBuilder 调toString 方法时也创建了String 对象bc （但是这个时候bc在字符串常量池中是不存在的）
        String str = new String("b") + new String("c");
        //因为这个时候字符串常量池中"bc" 是不存在的，执行该方法字符串常量池会存储堆对象的地址，这里就会指向上面str对象的地址
        //如果"bc"在字符串常量池中原本是存在的，那么执行该方法返回的就是字符串常量池中的地址，str ！= str 1
        str.intern();
        String str1 = "bc";
        System.out.println(str == str1); //true

    }
}
